package main;

import java.awt.Color;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

/**
 * Klasa glownego panelu gry
 * @author Maciej Krawczyk
 */
@SuppressWarnings("serial")
public class GamePanel extends JPanel implements ActionListener {

	/**Instancja ramki gry*/
	private GameFrame gf;
	/**Instancja ramki logowania*/
	private InitiationFrame inf;
	/**Panel zawierajacy panele przeciwnikow*/
	private Opponents opponents;
	/**Panel gracza*/
	private PlayerPanel playerPanel;
	/**Panel z motywem gry*/
	private ThemePanel themePanel;
	/**Okno dialogowe*/
	private JDialog dialog;
	/**Czcionka*/
	private Font font;
	/**modyfikator zarzadcy rozkladu
	 * @see java.awt.GridBagConstraints
	 */
	private GridBagConstraints c;
	
	/**
	 * Konstruktor panelu gry
	 * @param gf ramka gry
	 */
	public GamePanel(GameFrame gf, InitiationFrame inf) {

		this.gf = gf;
		this.inf = inf;
		this.setLayout(new GridBagLayout());
		this.setBackground(new Color(21, 134, 183));
		this.setOpaque(true);
		font = new Font(Font.SERIF, Font.PLAIN, 30);
		c = new GridBagConstraints();
		c.gridy = 0;
		c.gridx = 0;
		JDialog.setDefaultLookAndFeelDecorated(true);
	}
	
	public void resetFold(int opId) {
		opponents.resetFold(opId);
	}
	
	/**
	 * Metoda tworzy okno dialogowe informujace o wykluczeniu z gry
	 */
	public void showLoserDialog() {
		dialog = new JDialog(dialog, "Badugi", true);
		dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		dialog.setLocation(300, 300);
		dialog.setLayout(new GridLayout(2, 1, 10, 10));
		JLabel loseLabel = new JLabel("You lost the game ;(");
		loseLabel.setFont(font);
		JButton button = new JButton("OK");
		button.setFont(font);
		button.addActionListener(this);
		dialog.add(loseLabel);
		dialog.add(button);
		dialog.pack();
		dialog.toFront();
		dialog.setVisible(true);
	}
	
	/**
	 * Okno dialogowe pokazujace karty graczy po zakonczeniu rundy
	 * @param k okreslenie graczy, ktory wygral runde
	 */
	public void showCards(int k) {
		dialog = new JDialog(dialog, "Badugi", true);
		dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		dialog.setLocation(300, 300);
		dialog.setLayout(new GridLayout(k + 1, 1, 10, 10));
		dialog.toFront();
		dialog.pack();
		dialog.dispose();
	}
	
	/**
	 * Metoda dodaje etykiete (JLabel) do okna dialogowego
	 * @param text tekst wyswietlony w etykiecie
	 * @see import javax.swing.JLabel;
	 */
	public void addLabel(String text) {
		JLabel label = new JLabel();
		label.setFont(font);
		label.setText(text);
		dialog.add(label);
		dialog.pack();
		dialog.dispose();
	}
	
	/**
	 * Metoda dodaje przycisk (do okna dialogowego) zamykajacy okienko
	 */
	public void addButton() {
		JButton button = new JButton("OK");
		button.setFont(font);
		button.addActionListener(this);
		dialog.add(button);
		dialog.pack();
		dialog.setVisible(true);
	}
	
	/**
	 * Metoda tworzy okno dialogowe informujace o wygraniu gry
	 */
	public void showWinnerDialog() {
		dialog = new JDialog(dialog, "Badugi", true);
		dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		dialog.setLocation(300, 300);
		dialog.setLayout(new GridLayout(2, 1, 10, 10));
		JLabel winLabel = new JLabel("Congratulations! You won the game ;)");
		JButton button = new JButton("OK");
		button.setFont(font);
		button.addActionListener(this);
		winLabel.setFont(font);
		dialog.add(winLabel);
		dialog.add(button);
		dialog.pack();
		dialog.toFront();
		dialog.setVisible(true);
	}
	
	/**
	 * Metoda dodaje panele przeciwnikow do panelu gry
	 * @param playerId numer gracza
	 * @param players ilu graczy w grze
	 * @param blind jaka rola gracza w grze
	 */
	public void createOpponents(int playerId, int players, int blind) {
		opponents = new Opponents(playerId, players, blind);
		this.add(opponents, c);
		c.gridy++;
	}
	
	/**
	 * Metoda tworzy panel z motywem gry
	 */
	public void createThemePanel() {
		themePanel = new ThemePanel();
		this.add(themePanel, c);		
		c.gridy++;
	}
	
	/**
	 * Metoda tworzy panel gracza
	 * @param guiData dane gry
	 */
	public void createplayerPanel(GuiData guiData) {
		playerPanel = new PlayerPanel(guiData);
		playerPanel.setFocusable(true);
		requestFocusInWindow();
		this.add(playerPanel, c);
		gf.setVisible(true);
		inf.dispose();
	}
	
	/**
	 * Metoda steruje dostepem do panelu gracza
	 * @param k wariant dostepu
	 */
	public void setAccesToPanel(int k) {
		playerPanel.setAccesToPanel(k);
	}
	
	/**
	 * Metoda ustawia id gracza
	 * @param i id gracza
	 */
	public void setId(int i) {
		playerPanel.setId(i);
	}

	/**
	 * Akcesor zwracajacy panel gracza
	 * @return panel gracza
	 */
	public PlayerPanel getPlayer() {
		return this.playerPanel;
	}
	
	/**
	 * Akcesor zwracajacy panel przeciwnika
	 * @param o id przeciwnika
	 * @return panel przeciwnika
	 */
	public OpponentPanel getOpponent(int o) {
		return opponents.getOpponent(o);
	}

	/**Metoda pakujaca ramke gry*/
	public void pack() {
		for (int i = 0; i < 50; i++)
			gf.pack();
	}
	
	/**
	 * Akcesor podbicia stawki
	 * @return podbicie stawki
	 */
	public String getRaise() {
		return playerPanel.getRaise();
	}
	
	/**
	 * Akcesor podbicia stawki (pierwszy raz)
	 * @return podbicie stawki
	 */
	public String getBet() {
		return playerPanel.getBet();
	}
	
	/**
	 * Akcesor do 1 boxa
	 * @return czy gracz zaznaczyl box
	 */
	public boolean isCheckbox1() {
		return playerPanel.isCheckbox1();
	}

	/**
	 * Akcesor do 2 boxa
	 * @return czy gracz zaznaczyl box
	 */
	public boolean isCheckbox2() {
		return playerPanel.isCheckbox2();
	}
	
	/**
	 * Akcesor do 3 boxa
	 * @return czy gracz zaznaczyl box
	 */
	public boolean isCheckbox3() {
		return playerPanel.isCheckbox3();
	}
	
	/**
	 * Akcesor do 4 boxa
	 * @return czy gracz zaznaczyl box
	 */
	public boolean isCheckbox4() {
		return playerPanel.isCheckbox4();
	}
	
	/**Metoda odznacza wszystkie boxy*/
	public void clearCheckboxes() {
		playerPanel.clearCheckboxes();
	}
	
	/**Metoda udostepnia przycisk Check*/
	public void setAToCheck(boolean decision) {
		playerPanel.setAToCheck(decision);
	}
	
	/**Metoda udostepnia przycisk Call*/
	public void setAToCall(boolean decision) {
		playerPanel.setAToCall(decision);
	}
	
	/**Metoda udostepnia przycisk Bet*/
	public void setAToBet(boolean decision) {
		playerPanel.setAToBet(decision);
	}
	
	/**Metoda udostepnia przycisk Raise*/
	public void setAToRaise(boolean decision) {
		playerPanel.setAToRaise(decision);
	}
	
	/**Metoda udostepnia przycisk AllIn*/
	public void setAToAllIn(boolean decision) {
		playerPanel.setAToAllIn(decision);
	}
	
	/**Metoda udostepnia przycisk Fold*/
	public void setAToFold(boolean decision) {
		playerPanel.setAToFold(decision);
	}
	
	/**Metoda czysci pola tekstowe w panelu gracza*/
	public void clearFields() {
		playerPanel.clearFields();
	}
	
	/**Metoda udostepnia pole tekstowe Raise*/
	public void setAToRaiseField(boolean decision) {
		playerPanel.setAToRaiseField(decision);
	}
	
	/**Metoda udostepnia pole tekstowe Bet*/
	public void setAToBetField(boolean decision) {
		playerPanel.setAToBetField(decision);
	}
	
	/**
	 * Metoda podswietla na zielono aktualnego gracza
	 * @param opId numer przeciwnika
	 */
	public void highlightOp(int opId) {
		opponents.highlightOp(opId);
	}
	
	/**Metoda "gasi" gracza, ktory wykonal ruch
	 * * @param opId numer przeciwnika
	 */
	public void putOffOp(int opId) {
		opponents.putOffOp(opId);
	}
	
	/**
	 * Metoda informuje ile kart zmienil przeciwnik
	 * @param opId id przeciwnika
	 * @param howMany ile kart
	 */
	public void opExchange(int opId, int howMany) {
		opponents.opExchange(opId, howMany);
	}
	
	/**
	 * Metoda infromujaca, ktora mamy aktualnie runde
	 * @param text ktora runda
	 */
	public void setRoundLabel(String text) {
		playerPanel.setRoundLabel(text);
	}
	
	/**
	 * Metoda usuwa przeciwnika
	 * @param i id przeciwnika
	 */
	public void removeOp(int i) {
		opponents.removeOp(i);
	}

	/**
	 * Metoda zamykajaca okno dialogowe
	 * @see java.awt.event.ActionEvent
	 */
	@Override
	public void actionPerformed(ActionEvent evt) {
		dialog.dispose();
		gf.send("O");
		
	}
	
}
